package com.jvm.memory;

import org.junit.Test;

/**
 * StackSlotDemo.. 局部变量引起对象不回收
 *
 * @author Lizhong
 * @date 2019/3/13
 */
public class StackSlotDemo {
    private int _1m = 1024 * 1024;

    /**
     * 运行参数-verbose:gc
     */
    @Test
    public void test() {
        byte[] bytes = new byte[50 * _1m];
        System.gc();
        /*Out:~
         Pause Full (System.gc()) 56M->52M(184M) 4.443ms
         *
         */
    }

    /**
     * 因在同一修改作用域，不能回收 参数同上
     */
    @Test
    public void test02() {
        {
            byte[] bytes = new byte[50 * _1m];
        }
        System.gc();
        /*Out:~
         Pause Full (System.gc()) 56M->52M(184M) 4.443ms
         *
         */
    }

    /**
     * 修改作用域，对LocalStackVariable复用 bytes对象还保留对象的引用，复用清空保存（不宜大规模推广） 参数同上，堆内存完美回收
     */
    @Test
    public void test03() {
        {
            byte[] bytes = new byte[50 * _1m];
        }
        int i = 3;
        System.gc();
        /*Out:~
           Pause Full (System.gc()) 55M->1M(14M) 6.987ms
         *
         */
    }

    @Test
    public void testOther() {
        // 局部变量没有初始化不能使用
        int a;
        //  System.out.println(a);
    }

}
